package com.yc.thread.wait;

/**
 * 验证：obj被唤醒后，先获得锁，再退出代码块
 * 理论论证：A线程wait，接着执行B线程，B获得了锁， B线程把A唤醒，如果A还莫名其妙的重新获得了锁，那锁不就很奇怪了：
 * 在B已经获得锁的情况，A强行由获得了锁
 * @author yuancan
 *
 */
public class TestWait5 {
	
	
	public void m() {
		Object o = new Object();
		
		/**
		 * 1. wait
		 * 2. sleep 20秒
		 * 
		 */
		new Thread(() -> {
			synchronized(o) {
				try {
					o.wait();
					Thread.sleep(10000);//被唤醒后，还继续睡，如果他此时重新获得锁，那么
					System.out.println("T1 is over");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
			}
			
		},"T1").start();
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		/**
		 * 1. notify
		 * 2. sleep 20秒
		 * 
		 */
		new Thread(() -> {
			
			synchronized(o) {
				o.notify();
				System.out.println("o is notify");
				
			}
			
			//
			synchronized(o) {
				
				System.out.println("i am in");
				
			}
			
		},"T2").start();
		
	}
	
	

	public static void main(String[] args) {
		TestWait5 tw = new TestWait5();
		tw.m();

	}

}
